import java.util.regex.Pattern;

/**
 * SQL注入过滤工具类
 * 用于过滤可能包含SQL注入攻击的输入参数
 */
public class SqlInjectionFilter {
    
    // 常见SQL注入关键字模式
    private static final Pattern SQL_INJECTION_PATTERN = Pattern.compile(
        "\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|" +
        "\\/\\*.+?\\*\\/|\\-\\-.*|#.*|" +
        "\\b(select|insert|update|delete|from|where|drop|truncate|create|alter|grant|execute|exec|xp_cmdshell|call|declare|show|rename|set)\\b",
        Pattern.CASE_INSENSITIVE
    );
    
    // 常见SQL注入特殊字符
    private static final String[] SPECIAL_CHARACTERS = {
        ";", "--", "#", "/*", "*/", "@@", "@", "char", "nchar", "varchar", "nvarchar",
        "alter", "begin", "cast", "create", "cursor", "declare", "delete", "drop",
        "end", "exec", "fetch", "insert", "kill", "open", "select", "sysobjects",
        "syscolumns", "table", "update"
    };
    
    /**
     * 过滤排序字段，只允许字母、数字和下划线
     * @param sortField 排序字段
     * @return 过滤后的安全排序字段
     */
    public static String filterSortField(String sortField) {
        if (sortField == null || sortField.trim().isEmpty()) {
            return "id"; // 默认排序字段
        }
        
        // 只保留字母、数字和下划线
        String safeSortField = sortField.replaceAll("[^a-zA-Z0-9_]", "");
        
        // 检查是否为空
        if (safeSortField.isEmpty()) {
            return "id";
        }
        
        // 检查是否包含SQL注入关键字
        if (containsSqlInjectionKeywords(safeSortField)) {
            return "id";
        }
        
        return safeSortField;
    }
    
    /**
     * 过滤排序方向，只允许ASC和DESC
     * @param sortOrder 排序方向
     * @return 过滤后的安全排序方向
     */
    public static String filterSortOrder(String sortOrder) {
        if (sortOrder == null || sortOrder.trim().isEmpty()) {
            return "ASC"; // 默认升序
        }
        
        // 转为大写并检查是否为合法的排序方向
        String upperCaseSortOrder = sortOrder.trim().toUpperCase();
        if ("ASC".equals(upperCaseSortOrder) || "DESC".equals(upperCaseSortOrder)) {
            return upperCaseSortOrder;
        }
        
        return "ASC"; // 不合法则返回默认值
    }
    
    /**
     * 检查字符串是否包含SQL注入关键字
     * @param input 输入字符串
     * @return 是否包含SQL注入关键字
     */
    private static boolean containsSqlInjectionKeywords(String input) {
        if (input == null || input.isEmpty()) {
            return false;
        }
        
        // 使用正则表达式检查
        if (SQL_INJECTION_PATTERN.matcher(input).find()) {
            return true;
        }
        
        // 检查特殊字符
        for (String specialChar : SPECIAL_CHARACTERS) {
            if (input.contains(specialChar)) {
                return true;
            }
        }
        
        return false;
    }
    
    /**
     * 过滤通用SQL参数
     * @param input 输入参数
     * @return 过滤后的安全参数
     */
    public static String filterSqlParam(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }
        
        // 替换特殊字符
        String filtered = input
            .replace("'", "''")
            .replace(";", "")
            .replace("--", "")
            .replace("/*", "")
            .replace("*/", "");
        
        return filtered;
    }
}
    